#include "tools.h"
#include <stdio.h>
#include "bank.h"

#define BUF_SIZE (4096)

void sub_menu(void);
void save(void);
void take(void);
void query(void);
void transfer(void);
void repass(void);
Account acc = {1,"0","0","0",0,0};

int cli_fd;

void main_menu(void)
{
	puts("******欢迎使用指针银行******");
	puts("1、开户		2、登陆");
	puts("3、销户		4、解锁");
	puts("0、退出");
}
//开户
void open_acc(void)
{
	acc.type=M_OPEN;
	printf("请输入您的身份证：");
	get_str(acc.card,20);
	printf("请输入开户金额：");
	scanf("%f",&acc.balance);
}

//登陆
void login(void)
{
	acc.type = M_LOGIN;
	printf("请输入银行卡号：");
	get_str(acc.bank,20);
	printf("请输入密码：");
	get_pass(acc.pass,7,true);
	
	char msg[4096];
	sprintf(msg,"%d %s %s %s %f %d",acc.type,acc.bank,acc.card,acc.pass,acc.balance,acc.islock);
	
	//发送数据
	int ret_size = write(cli_fd,msg,strlen(msg)+1);
	
	//接受返回信息
	int recv_size = read(cli_fd,msg,sizeof(msg));
	
	//打印是否登陆成功信息
	puts(msg);
	anykey_continue();
		if('Y' != msg[0])
	{
		return;
	}
	for(;;)
	{
		sub_menu();
		switch(get_cmd('1','6')-'0'+4)
		{
		case M_SAVE: 	save();		break;	// 存款
		case M_TAKE: 	take();		break;	// 取款
		case M_QUERY: 	query();	break;	// 查询
		case M_TRANSFER:transfer();	break;	// 转账
		case M_REPASS:	repass();	break;	// 改密
		default: exit(EXIT_SUCCESS);break;	// 退出
		}
		
		char buf[BUF_SIZE];
		sprintf(buf,"%d %s %s %s %f %d",acc.type,acc.bank,acc.card,acc.pass,acc.balance,acc.islock);
		//发送数据
		write(cli_fd,buf,strlen(buf)+1);
		//接收返回信息
		read(cli_fd,buf,sizeof(msg));
		// 显示服务端执行的结果
		printf("%s\n",buf);
		anykey_continue();
	}
}

// 销户
void destory(void)
{
	acc.type = M_DESTORY;
	printf("请输入银行卡号：");
	get_str(acc.bank,20);
	printf("请输入身份证号：");
	get_str(acc.card,20);
	printf("请输入密码：");
	get_pass(acc.pass,7,true);
}

// 解锁
void unlock(void)
{
	acc.type = M_UNLOCK;
	printf("请输入银行卡号：");
	get_str(acc.bank,20);
	printf("请输入身份证号：");
	get_str(acc.card,20);
	printf("请输入密码：");
	get_pass(acc.pass,7,true);
}

// 子菜单
void sub_menu(void)
{
	puts("******恭喜您登陆成功******");
	puts("1、存款		2、取款");
	puts("3、查询		4、转账");
	puts("5、改密		6、退出");
}


// 存款
void save(void)
{
	acc.type = M_SAVE;
	printf("请输入存款金额：");
	scanf("%f",&acc.balance);
}

// 取款
void take(void)
{
	acc.type = M_TAKE;
	printf("请输入取款金额：");
	scanf("%f",&acc.balance);
}

// 查询
void query(void)
{
	acc.type = M_QUERY;
}

// 转账
void transfer(void)
{
	acc.type = M_TRANSFER;
	printf("请输入目标银行卡号：");
	get_str(acc.card,20);
	printf("请输入转账金额：");
	scanf("%f",&acc.balance);
}

// 改密
void repass(void)
{
	char pass1[10] = {} , pass2[10] = {};
	printf("请输入新密码：");
	get_pass(pass1,10,true);
	printf("请再次输入新密码：");
	get_pass(pass2,10,true);
	acc.type = M_REPASS;
	if(strcmp(pass1,pass2))
	{
		//两次输入的密码不相同，修改失败!
		strcpy(acc.pass,"-1");
	}
	else
	{
		strcpy(acc.pass,pass1);
	}
}
int main()
{
	// 创建socket
	cli_fd = socket(AF_INET,SOCK_STREAM,0);
	if(0 > cli_fd)
	{
		perror("socket");
		return -1;
	}

	// 准备地址
	struct sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(10001);
	addr.sin_addr.s_addr = inet_addr("47.110.244.211");

	// 连接
	if(connect(cli_fd,(struct sockaddr*)&addr,sizeof(addr)))
	{
		perror("connect");
		return -1;
	}
	for(;;)
	{
			main_menu();
			switch(get_cmd('0','7')-'0')
			{
				case M_EXIT:	return 0;	break;		// 退出
				case M_OPEN:	open_acc();	break;		// 开户
				case M_LOGIN: 	login();	continue;	// 登陆
				case M_DESTORY: destory();	break;		// 销户
				case M_UNLOCK:	unlock();	break; 		// 解锁
			}
			char buf[4096];
			sprintf(buf,"%d %s %s %s %f %d",acc.type,acc.bank,acc.card,acc.pass,acc.balance,acc.islock);
			//发送数据
			int ret_size=write(cli_fd,buf,strlen(buf)+1);
			//接收返回信息
			int recv_size = read(cli_fd,buf,4096);
			printf("%s\n",buf);
			anykey_continue();
	}
}



